<?php
/**
 * 将扁平数组转换为树形结构
 *
 * @param array $items 包含id和parentId的二维数组
 * @param int $parentId 起始父ID（默认为0）
 * @param string $idKey ID字段名（默认为'id'）
 * @param string $parentKey 父ID字段名（默认为'parentId'）
 * @param string $childrenKey 子节点字段名（默认为'children'）
 * @return array 树形结构数组（不包含id和parentId）
 */
function buildTreeWithoutIds(array $items, $parentId = 0, $idKey = 'id', $parentKey = 'parentId', $childrenKey = 'children')
{
    $branch = [];
    foreach ($items as $item) {
        if ($item[$parentKey] == $parentId) {
            // 复制当前项，排除id和parentId
            $newItem = $item;

            // 递归处理子项
            $children = buildTreeWithoutIds($items, $item[$idKey], $idKey, $parentKey, $childrenKey);
            if ($children) {
                $newItem[$childrenKey] = $children;
            }

            $branch[] = $newItem;
        }
    }
    return $branch;
}

/**
 * 从角色数据中提取并处理 menuPermissions
 *
 * @param array $roles 角色数据数组
 * @return array 处理后的扁平化且去重的权限ID数组
 */
function processMenuPermissions(array $roles): array
{
    $permissions = [];

    foreach ($roles as $role) {
        if (isset($role['menuPermissions']) && is_string($role['menuPermissions'])) {
            // 将 JSON 字符串转换为数组
            $decoded = json_decode($role['menuPermissions'], true);

            if (is_array($decoded)) {
                // 使用 array_walk_recursive 扁平化多维数组
                array_walk_recursive($decoded, function($value) use (&$permissions) {
                    if (is_int($value)) {
                        $permissions[] = $value;
                    }
                });
            }
        }
    }

    // 去重并重新索引数组
    return array_values(array_unique($permissions));
}
